/** 0. Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中，所有字母都是小写并使用下划线分隔单词。*/
fn other_fun(){
  println!("This is a function!");
}

/** 1. 参数必须要定义类型*/
/*fn other_fun1(a, b){ //Function `other_fun1` cannot have anonymous parameters
  println!("a={},b={}", a, b);
}*/
fn other_fun1(a: i32, b: u32){
  println!("a={},b={}", a, b);
}


/** 2. return 可省*/
/*fn other_fun2(a: i32, b: i32)->i32{
  let result = a + b;
  return result;
}*/

fn other_fun2(a: i32, b: i32)->i32{
  let result = a + b;

  //result;
  //↑ 不能有 ;
  /*
    表达式的结尾没有分号。如果在表达式的结尾加上分号，它就变成了语句，而语句不会返回值。
    详见下面的---> 3. 表达式 和 语句 区别
  */
  result
}


fn main() {
  other_fun();
  other_fun1(-1,2); //a=-1,b=2
  println!("{}", other_fun2(1, 1)); //2

  //可以把函数赋给一个变量, 这个变量的类型为 fn(i32,i32)
  let fnx = other_fun2;
  println!("{}", fnx(99, 98)); //197

  /** 3. 表达式 和 语句 区别*/
  //语句是执行一些操作, 但是不返回值的指令
  let y = 1; //← 整个是一条语句
  // let x = (let y = 1); // ← 会报错

  //表达式会计算一些值
  /*
    表达式会计算出一个值，并且你将编写的大部分 Rust 代码是由表达式组成的。
    考虑一个数学运算，比如 5 + 6，这是一个表达式并计算出值 11。
    表达式可以是语句的一部分：语句 let y = 6; 中的 6 是一个表达式，它计算出的值是 6。
    函数调用是一个表达式。宏调用是一个表达式。
    我们用来创建新作用域的大括号（代码块），{}，也是一个表达式:
  */
  let y = {
    let x = 1;
    x + 1 // 表达式的结尾没有分号。如果在表达式的结尾加上分号，它就变成了语句，而语句不会返回值。
  };
  println!("{}", y); //2
}
